

package business.database;
import dao.Center;
import java.util.List;
import utils.*;
import dao.*;


/**
 * Metodos utiles para la obtencion de cualquier servicio relacionado con los centros
 * @author 53385255R
 *
 */
class CenterUtils {

	 /**
    * Obtiene los PIO en los que aparece el segmento un minimo de veces 
    * @param idGr
    * @return los PIOs en que aparece el segmento
    */
 static List<Center> getPIOsFromGroupPIO(int idGr) {
	   //obtenemos los PIO donde aparece este grupo
	   List<Center> centers = new ArrayList<Center>()
	   Database.getInstance().sqlite.rows("select provincia, instit, organismo from groupPIO where idGroup =${idGr}").each {
		   centers.add(new Center(it[0], it[1], it[2]))
	   }
	   
	   return centers
   }
   
   /**
   * Obtiene los principales PIOs en los que aparece el segmento un minimo de veces
   * @param idGr
   * @return los principales PIOs en que aparece el segmento
   */
static List<Center> getImportantPIOsFromGroupPIO(int idGr) {
	  //obtenemos los PIO donde aparece este grupo
	  List<Center> centers = new ArrayList<Center>()
	  int maxPer = -1;
	  Database.getInstance().sqlite.rows("select provincia, instit, organismo, per from groupPIO where idGroup =${idGr}").each {
		  int per = it[3]
		  
		  if (maxPer <= per) {
			  maxPer = per
			  centers.add(new Center(it[0], it[1], it[2]))
		  }
	  }
	  
	  return centers
  }


/**
* Obtiene los principales PIOs en los que aparece la palabra un minimo de veces
* @param idGr
* @return los principales PIOs en que aparece la palabra
*/
static List<Center> getImportantPIOsFromWordPIO(int idW) {
   //obtenemos los PIO donde aparece esta palabra
   List<Center> centers = new ArrayList<Center>()
   int maxPer = -1;
   Database.getInstance().sqlite.rows("select provincia, instit, organismo, per from wordPIO where idword =${idW}").each {
	   int per = it[3]
	   
	   if (maxPer <= per) {
		   maxPer = per
		   centers.add(new Center(it[0], it[1], it[2]))
	   }
   }
   
   return centers
}
   
   /**
   * Obtiene los PI en los que aparece el segmento un minimo de veces
   * @param idGr
   * @return los PIs en que aparece el segmento
   */
static List<Center> getPIsFromGroupPI(int idGr) {
	  //obtenemos los PI donde aparece este grupo
	  List<Center> centers = new ArrayList<Center>()
	  Database.getInstance().sqlite.rows("select provincia, instit from groupPI where idGroup =${idGr}").each {
		  centers.add(new Center(it[0], it[1]))
	  }
	  
	  return centers
  }
 
 /**
 * Obtiene los PI en los que aparece la palabra un minimo de veces
 * @param idWord
 * @return los PIs en que aparece la palabra
 */
static  List<Center> getPIsFromWordPI(int idWord) {
	//obtenemos los PI donde aparece este grupo
	List<Center> centers = new ArrayList<Center>()
	Database.getInstance().sqlite.rows("select provincia, instit from wordPI where idWord =${idWord}").each {
		centers.add(new Center(it[0], it[1]))
	}
	
	return centers
}
  
  /**
  * Obtiene los principales PI en los que aparece el segmento un minimo de veces
  * @param idGr
  * @return los principales PIs en que aparece el segmento
  */
static  List<Center> getImportantPIsFromGroupPI(int idGr) {
	 //obtenemos los PI donde aparece este grupo
	 List<Center> centers = new ArrayList<Center>()
	 int maxPer = -1;
	 Database.getInstance().sqlite.rows("select provincia, instit, per from groupPI where idGroup =${idGr} order by per desc").each {
		 int per = it[2]
		 if (maxPer <= per) {
			 maxPer = per;
		 	centers.add(new Center(it[0], it[1]))
		 }
	 }
	 
	 return centers
 }
 
 /**
 * Obtiene los principales PI en los que aparece la palabra un minimo de veces
 * @param idGr
 * @return los principales PIs en que aparece la palabra
 */
static List<Center> getImportantPIsFromWordPI(int idW) {
	//obtenemos los PI donde aparece este grupo
	List<Center> centers = new ArrayList<Center>()
	int maxPer = -1;
	Database.getInstance().sqlite.rows("select provincia, instit, per from wordPI where idword =${idW} order by per desc").each {
		int per = it[2]
		if (maxPer <= per) {
			maxPer = per;
			centers.add(new Center(it[0], it[1]))
		}
	}
	
	return centers
}

/**
* Comprueba si un grupo de palabras aparece minimamente relacionado con una serie de PIOs
* @param idGr
* @param centers objetos center con la informacion de los PIOs
* @return si el grupo esta minimamente ligado a los PIOs
*/
static boolean hasPIO(int idGr, List<Center> centers) {
   
   List<Center> centers2 = getPIOsFromGroupPIO(idGr)
   
   boolean fnd = false;
   int cnt1 = 0;
   
   while ((centers.size() > cnt1) && !fnd) {
	   int cnt2 = 0;
	   while ((centers2.size() > cnt2) && !fnd) {
		   fnd = (centers.get(cnt1).PROVINCIA.equals(centers2.get(cnt2).PROVINCIA)
			   && centers.get(cnt1).INSTIT.equals(centers2.get(cnt2).INSTIT)
			   && centers.get(cnt1).ORGANISMO.equals(centers2.get(cnt2).ORGANISMO))
		   cnt2++;
	   }
	   cnt1++;
   }
 
   return fnd;
}

/**
* Comprueba si un grupo de palabras aparece minimamente relacionado con una serie de PIs
* @param idGr
* @param centers objetos center con la informacion de los PIs
* @return si el grupo esta minimamente ligado a los PIs
*/
static boolean hasPI(int idGr, List<Center> centers) {
  
  List<Center> centers2 = getPIsFromGroupPI(idGr)
  
  boolean fnd = false;
  int cnt1 = 0;
  
  while ((centers.size() > cnt1) && !fnd) {
	  int cnt2 = 0;
	  while ((centers2.size() > cnt2) && !fnd) {
		  
		  fnd = (centers.get(cnt1).PROVINCIA.equals(centers2.get(cnt2).PROVINCIA)
			  && centers.get(cnt1).INSTIT.equals(centers2.get(cnt2).INSTIT))
		  cnt2++;
	  }
	  cnt1++;
  }

  return fnd;
}

/**
* Comprueba si un grupo de palabras aparece minimamente relacionado con una serie de PIOs
* @param idGr
* @param centers objetos center con la informacion de los PIOs
* @return si el grupo esta minimamente ligado a los PIOs
*/
static boolean hasImportantPIO(int idGr, List<Center> centers) {
 
 List<Center> centers2 = getImportantPIOsFromGroupPIO(idGr)
 
 boolean fnd = false;
 int cnt1 = 0;
 
 while ((centers.size() > cnt1) && !fnd) {
	 int cnt2 = 0;
	 while ((centers2.size() > cnt2) && !fnd) {
		 fnd = (centers.get(cnt1).PROVINCIA.equals(centers2.get(cnt2).PROVINCIA)
			 && centers.get(cnt1).INSTIT.equals(centers2.get(cnt2).INSTIT)
			 && centers.get(cnt1).ORGANISMO.equals(centers2.get(cnt2).ORGANISMO))
		 
		 cnt2++;
	 }
	 cnt1++;
 }

 return fnd;
}

/**
* Comprueba si un grupo de palabras aparece minimamente relacionado con una serie de PIs
* @param idGr
* @param centers objetos center con la informacion de los PIs
* @return si el grupo esta minimamente ligado a los PIs
*/
static boolean hasImportantPI(int idGr, List<Center> centers) {

List<Center> centers2 = getImportantPIsFromGroupPI(idGr)

boolean fnd = false;
int cnt1 = 0;

while ((centers.size() > cnt1) && !fnd) {
	int cnt2 = 0;
	while ((centers2.size() > cnt2) && !fnd) {
		fnd = (centers.get(cnt1).PROVINCIA.equals(centers2.get(cnt2).PROVINCIA)
			&& centers.get(cnt1).INSTIT.equals(centers2.get(cnt2).INSTIT))
		cnt2++;
	}
	cnt1++;
}

return fnd;
}

static List<Center> getCentersForCorp(String corp) {
	//obtenemos los PIO del corp
	List<Center> centers = new ArrayList<Center>()
	int maxPer = -1;
	Database.getInstance().sqlite.rows("select c.* from center c inner join centers_corps cc on c.idce = cc.idce inner join corp co on co.idcorp = cc.idcorp where co.corp = '${corp}'").each {
		/*
		int idCe = it[0]
		String ISO = it[1]
		String COUNTRY = it[2]
		String PROVINCIA = it[3]
		String INSTIT = it[4]
		String ORGANISMO = it[5]
		String DPTO = it[6]
		String SECTOR = it[7]
		*/
		centers.add(new Center(it[0], it[1], it[2], it[3], it[4], it[5], it[6], it[7]))
	}
	
	
	return centers
}

/**
* Actualiza la columna sector de la tabla center de sqlite a partir de la base de conocimiento
*/
static void fillSectorColumnInCenters() {

	
   Database.getInstance().sqlKnBase.eachRow("select instit, sector from sector", {
	   
	   String instit = it[0]
	   String sect = it[1]
	   
	   Database.getInstance().sqlite.execute("UPDATE center SET SECTOR = '${sect}' WHERE INSTIT = '${instit}'")
   })

}



static main(args) {
	CenterUtils.fillSectorColumnInCenters();
}
}